package com.itzhoun.dynamicProxy;

import com.itzhoun.BuyHouse;
import com.itzhoun.BuyHouseImpl;

import java.lang.reflect.Proxy;

/**
 * @author 周楠
 * @Date 2023/01/16/下午 1:37
 */
public class DynamicProxyTest {

    /**动态代理
     * 动态代理有以下特点:
     *
     * 1.代理对象,不需要实现接口
     *
     * 2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
     *
     * 代理类不用再实现接口了。但是，要求被代理对象必须有接口。
     *
     * 动态代理实现：
     *
     * Java.lang.reflect.Proxy类可以直接生成一个代理对象
     *
     * Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)生成一个代理对象
     *
     * 参数1:ClassLoader loader 代理对象的类加载器 一般使用被代理对象的类加载器
     *
     * 参数2:Class<?>[] interfaces 代理对象的要实现的接口 一般使用的被代理对象实现的接口
     *
     * 参数3:InvocationHandler h (接口)执行处理类
     *
     * InvocationHandler中的invoke(Object proxy, Method method, Object[] args)方法：调用代理类的任何方法，此方法都会执行
     *
     * 参数3.1:代理对象(慎用)
     *
     * 参数3.2:当前执行的方法
     *
     * 参数3.3:当前执行的方法运行时传递过来的参数
     *
     * 虽然相对于静态代理，动态代理大大减少了我们的开发任务，同时减少了对业务接口的依赖，降低了耦合度。
     * 但是还是有一点点小小的遗憾之处，那就是它始终无法摆脱仅支持interface代理的桎梏（我们要使用被代理的对象的接口），因为它的设计注定了这个遗憾。
     */


    public static void main(String[] args) {
        BuyHouse buyHouse = new BuyHouseImpl();
        BuyHouse proxyInstance = (BuyHouse)Proxy.newProxyInstance(BuyHouse.class.getClassLoader(), new Class[]{BuyHouse.class}, new DynamicProxyHandler(buyHouse));
        proxyInstance.buyHouse();

    }
}
